package gp02.uniandes.dialgo.mundo;

/**
 * Clase que modela el intenerario de la red de transportes
 * @author ca.rodriguez91
 * 
 */
public class ItinerarioRuta
{

    // ---------------------------------------------------------------------------
    // ATRIBUTOS
    // ---------------------------------------------------------------------------
    /**
     * Atributo que modela el nombre de la ruta propuesta
     */
    private String nombreRuta;
    /**
     * Atributo que modela la lista de la ciudades pertenecientes a la ruta propuesta
     */
    private Ciudad[] ciudades;
    /**
     * Atributo que modela la lista de conexiones existentes
     */
    private Conexion[] conexiones;
    /**
     * Atributo que modela la ciudad origen de la ruta
     */
    private Ciudad ciudadOrigen;
    /**
     * Atributo que modela la ciudad destino de la ruta
     */
    private Ciudad ciudadDestino;
    /**
     * Atributo que modela el tiempo total de la ruta propuesta
     */
    private int tiempoTotal;
    /**
     * Atributo que modela el dia de inicio de la ruta
     */
    private DiasSemana dia;
    /**
     * Atributo que modela la hora de inicio deseada del itinierario
     */
    private String horaSalidaDeseada;
    /**
     * Atributo que modela la hora de inicio del itinerario
     */
    private String horaSalida;
    // ---------------------------------------------------------------------------
    // CONSTRUCTOR
    // ---------------------------------------------------------------------------
    /**
     * Constructor de la clase por defecto sin parametros
     */
    public ItinerarioRuta( )
    {
    }
    /**
     * Constructor de la clase por ciudades
     * @param ciudades Las ciudades pertenecientes a la ruta propuesta
     */
    public ItinerarioRuta( Ciudad[] ciudades )
    {
        this.ciudades = ciudades;
        crearConexiones( );
    }
    // ---------------------------------------------------------------------------
    // METODOS
    // ---------------------------------------------------------------------------
    /**
     * Metodo que crea las conexiones entre las ciudades segun la ruta propuesta
     * @param ciudadOrigen TODO
     */
    public void crearConexiones( )
    {
        conexiones = new Conexion[ciudades.length - 1];
        for( int i = 0; i < ciudades.length; i++ )
        {
            if( i + 1 < ciudades.length )
            {
                Conexion nueva = new Conexion( ciudades[ i ], ciudades[ i + 1 ] );
                ciudades[ i ].setCiudadSiguiente( ciudades[ i + 1 ] );
                conexiones[ i ] = nueva;
            }
        }
        calcularTiempoTotal( );
    }
    /**
     * Metodo que calcula el tiempo de demora total de la ruta propuesta
     * @return costo El tiempo de demora total de la ruta propuesta
     */
    public void calcularTiempoTotal( )
    {
        for( int i = 0; i < conexiones.length; i++ )
        {
            tiempoTotal += conexiones[ i ].getTiempoDemora( );
        }
    }
    public void agregarOrigen( Ciudad origen )
    {
        origen.esOrigen( );
        origen.setCiudadSiguiente( ciudades[ 0 ] );
        Ciudad[] rutaCompleta = new Ciudad[ciudades.length + 1];
        rutaCompleta[ 0 ] = origen;
        for( int i = 0; i < ciudades.length; i++ )
        {
            rutaCompleta[ i + 1 ] = ciudades[ i ];
        }
        ciudades = rutaCompleta;
        crearConexiones( );
    }
    /**
     * Metodo que retorna el tiempo total de viaje en la ruta establecida
     * @return
     */
    public int getTiempoTotal( )
    {
        return tiempoTotal;
    }
    /**
     * Metodo que retorna la ciudad de origen del itineriario
     * @return ciudadOrigen La ciudad origen del itinerario
     */
    public Ciudad getCiudadOrigen( )
    {
        return ciudadOrigen;
    }
    /**
     * Metodo que retorna la ciudad de destino del itinerario
     * @return ciudadDestino La ciduad destino del itinerario
     */
    public Ciudad getCiudadDestino( )
    {
        return ciudadDestino;
    }
    /**
     * Metodo que retorna el nombre de la ruta propuesta
     * @return nombreRuta El nombre de la ruta propuesta
     */
    public String getNombreRuta( )
    {
        return nombreRuta;
    }
    /**
     * Metodo que asigna el nombre de la ruta propuesta
     * @param nombreRuta El nuevo nombre de la ruta propuesta
     */
    public void setNombreRuta( String nombreRuta )
    {
        this.nombreRuta = nombreRuta;
    }
    /**
     * Metodo que asigna las ciudades de la ruta de propuesta
     * @param ciudades Las nuevas ciudades de la ruta propuesta
     */
    public void setCiudades( Ciudad[] ciudades )
    {
        this.ciudades = ciudades;
    }
    /**
     * Metodo que retorna las conexiones de la ruta propuesta
     * @return conexiones La lista con las conexiones de la ruta propuesta
     */
    public Conexion[] getConexiones( )
    {
        return conexiones;
    }
    /**
     * Metodo que asinga las conexiones de la ruta propuesta
     * @param conexiones La lista de las nuevas conexiones de la ruta propuesta
     */
    public void setConexiones( Conexion[] conexiones )
    {
        this.conexiones = conexiones;
    }
    /**
     * Metodo que asigna la ciudad origen de la ruta propuesta
     * @param ciudadOrigen La nueva ciudad origen de la ruta propuesta
     */
    public void setCiudadOrigen( Ciudad ciudadOrigen )
    {
        this.ciudadOrigen = ciudadOrigen;
    }
    /**
     * Metodo que asigna la ciudad destino de la ruta propuesta
     * @param ciudadDestino La nueva ciudad destino de la ruta propuesta
     */
    public void setCiudadDestino( Ciudad ciudadDestino )
    {
        this.ciudadDestino = ciudadDestino;
    }
    /**
     * Metodo que asigna el dia de inicio de la ruta
     * @param dia El dia de inicio de la ruta
     */
    public void setDia( DiasSemana dia )
    {
        this.dia = dia;
    }
    /**
     * Metodo que retorna el dia de inicio de la ruta
     * @return dia El dia de inicio de la ruta
     */
    public DiasSemana getDia( )
    {
        return dia;
    }
    /**
     * Metodo que suma tiempo al tiempo total actual
     * @param tiempo El tiempo a sumar al tiempo total actual
     */
    public void sumarTiempo( int tiempo )
    {
        this.tiempoTotal += tiempo;
    }
    /**
     * Metodo que retorna la hora de salida deseada de la ruta
     * @return horaSalidaDeseada La hora de salida deseada de la ruta
     */
    public String getHoraSalidaDeseada( )
    {
        return horaSalidaDeseada;
    }
    /**
     * Metodo que asigna la hora de salida deseada de la ruta
     * @param horaSalidaDeseada La hora de salida deseada de la ruta
     */
    public void setHoraSalidaDeseada( String horaSalidaDeseada )
    {
        this.horaSalidaDeseada = horaSalidaDeseada;
    }
    /**
     * Metodo que asigna la hora de salida de la ruta
     * @param horaSalida La nueva hora de salida de la ruta
     */
    public void setHoraSalida( String horaSalida )
    {
        this.horaSalida = horaSalida;
    }
    /**
     * Metodo que retorna la hora de salida de la ruta
     * @return horaSalida La hora de salida de la ruta
     */
    public String getHoraSalida( )
    {
        return horaSalida;
    }
    /**
     * Metodo que retorna la hora de salida de la ruta en enteros
     * @return La hora de salida de la ruta en enteros
     */
    public int getHoraSalidaEntero( )
    {
        return Integer.parseInt( horaSalida.split( Ciudad.SEPARADOR )[ 0 ] );
    }
    /**
     * Metodo que retrona los minutos de salida de la ruta en enteros
     * @return Los minutos de salida de la ruta en enteros
     */
    public int getMinutosSalidaEntero( )
    {
        return Integer.parseInt( horaSalida.split( Ciudad.SEPARADOR )[ 1 ] );
    }
    /**
     * Metodo que determina la hora de salida de la ruta si la hora 'hora:minutos' no existe como salida de la ciudad origen
     * @param hora La hora deseada de salida
     * @param minutos Los minutos deseados de salida
     */
    public void determinarHoraPartidaRuta( int hora, int minutos )
    {
        this.horaSalida = ciudadOrigen.determinarHoraPartida( hora, minutos );
    }
}
